package com.changan.utils;

import com.changan.entity.Menu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 构建菜单树的工具类
 */
public class MenuTreeBuilder {

    public static List<Menu> build(List<Menu> menus) {
        //1.先把一级菜单给拿到
        List<Menu> menuList = new ArrayList<>();
        for (Menu menu : menus){
            if(menu.getParentId()== 0){//说明这个是一级菜单
                menuList.add(menu);
            }
        }

        //对一级菜单进行排序
        Collections.sort(menuList,Menu.order());

        //2.循环为一级菜单设置子菜单
        for (Menu menu: menuList) {
            //参数一:一级菜单的id   参数二:所有的菜单数据
            //一级菜单设置子菜单
            menu.setChildMenus(getChildMenu(menu.getId(),menus));
        }

        return menuList;
    }

    /**
     * 这个方法就是获取子菜单的方法
     * @param id
     * @param menus
     * @return
     */
    private static List<Menu> getChildMenu(Long id, List<Menu> menus) {
        //这个就是子菜单
        List<Menu> childList = new ArrayList<>();

        //这里仅仅是设置二级菜单,万一有多级菜单呢?需要使用递归实现
        for (Menu menu: menus) {
            //遍历所有的菜单,当父级id等于传过来的id的时候,说明当前的菜单属于当前id的子菜单
            //不能将按钮设置为菜单
            if(menu.getParentId().equals(id)&&menu.getType().equals("0")){
                childList.add(menu);
            }
        }

        //对二级菜单进行排序
        Collections.sort(childList,Menu.order());

        //1.菜单没有排序   2.递归还没有停止
        for (Menu menu: childList) {
            //将子菜单进行循环(使用递归进行多级菜单的获取)
            menu.setChildMenus(getChildMenu(menu.getId(),menus));
        }

        // 递归退出条件
        if (childList.size() == 0) {
            return new ArrayList<>();
        }

        return childList;

    }
}
